package com.study.aop.AspectJAop.基于xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @author chenhs
 * @date 2019/9/27
 */
public class MyAspect {
	/*
aop联盟定义通知类型，具有特性接口，必须实现，从而确定方法名称。
aspectj 基于xml，只定义类型名称。已经方法格式。
before:前置通知(应用：各种校验) 在方法执行前执行，如果通知抛出异常，阻止方法运行。
afterReturning:后置通知(应用：常规数据处理)方法正常返回后执行，如果方法中抛出异常，
通知无法执行必须在方法执行后才执行，所以可以获得方法的返回值。
重要 ：around:环绕通知(应用：十分强大，可以做任何事情)方法执行前后分别执行，可以阻止方法的执行必须手动执行目标方法
afterThrowing:抛出异常通知(应用：包装异常信息) 方法抛出异常后执行，如果方法没有抛出异常，无法执行
*after:最终通知(应用：清理现场)方法执行完毕后执行，无论方法中是否出现异常
*/
	
	//org.aspectj.lang.JoinPoint;
	public  void befor(JoinPoint point){
		System.out.println("前置增强:"+point.getSignature().getName());
		/*
		* 前置方法的格式 参数一：JoinPoint 用于描述链接点 可以获取链接点方法的方法名等着类值。
		* 、
		*
		* */
	}
	public  void afterRuning(JoinPoint point,Object ovj){
		System.out.println("后置增强"+ovj);
		/*
		* 参数一： org.aspectj.lang.JoinPoint
		* 参数二：类型必须为 Object  ，名称与xml returning标签配置的要一致。
		*
		* */
	}
	public  void afterThowing(JoinPoint point,Throwable e){
		System.out.println("异常增强"+e.getMessage());
		/*
		* 格式   org.aspectj.lang.JoinPoint point 这个参数必须填
		* 			Throwable e 必须
		*
		* */
	}
	/*
	* 环绕增强
	*  格式 返回值必须为  Object
	* 		参数必须为 ： org.aspectj.lang.ProceedingJoinPoint;
	* 		必须抛出异常
	* 			  手动执行目标方法
	*
	*
	* */
	public  Object around(ProceedingJoinPoint point )throws  Throwable{
		System.out.println("换绕增强_前");
		Object proceed = point.proceed();
		System.out.println("换绕增强_后");
		return  proceed;
	}
	public  void after(){
		System.out.println("最终增强");
	}
	
}
